/* 
给你一个非空数组，返回此数组中 第三大的数 。如果不存在，则返回数组中最大的数。

示例：

输入：[3, 2, 1]
输出：1
解释：第三大的数是 1 。
示例 2：

输入：[1, 2]
输出：2
解释：第三大的数不存在, 所以返回最大的数 2 。
示例 3：

输入：[2, 2, 3, 1]
输出：1
解释：注意，要求返回第三大的数，是指在所有不同数字中排第三大的数。
此例中存在两个值为 2 的数，它们都排第二。在所有不同数字中排第三大的数为 1 。


进阶：你能设计一个时间复杂度 O(n) 的解决方案吗？
*/

/* 
思路1:先排序，再去重，找到索引2的就是第三大的数，如果数组长度不够，就取第一项为最大的数
时间复杂度：O(nlogn)

思路2: 一次遍历，用三个变量存储三个值，遍历数组的每一项，根据此项与三个变量的大小关系，模拟实现在合适的位置插入(较大项)，删除(最小项)操作
时间复杂度：O(n)

*/

/**
 * @param {number[]} nums
 * @return {number}
 */
 var thirdMax = function(nums) {
    //  思路1
    /* nums.sort((a,b)=>b-a)
    let narr=[...new Set(nums)]
    return narr.length>2?narr[2]:narr[0] */

    // 思路2
    // 声明三个最小值，存储时a>b>c
    let a = -Number.MAX_VALUE, b = -Number.MAX_VALUE, c = -Number.MAX_VALUE;
    // 遍历数组
    for (const num of nums) {
    // 如果此项大于a，就赋值给a,数据依次右移
        if (num > a) {
            c = b;
            b = a;
            a = num;
        } else if (a > num && num > b) {
            c = b;
            b = num;
        } else if (b > num && num > c) {
            c = num;
        }
    }
    return c === -Number.MAX_VALUE ? a : c;
};
// 运行

let nums = [5,2,4,1,3,6,0]
console.log(thirdMax(nums));